#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

#include "sans.h"
#include "garbagecollector.h"
#include "runtime.h"

sdata bltn__plus(sdata x, sdata y) {
  if (x.tag == tnumb && y.tag == tnumb) {
    return SDNUMB(x.data.ivalue + y.data.ivalue);
  }
  log_err("runtime_eq/bltn_eq: non-number argument\n");
  exit(-1);
}

// subtraction
sdata bltn__(sdata x, sdata y) {
  if (x.tag == tnumb && y.tag == tnumb) {
    return SDNUMB(x.data.ivalue - y.data.ivalue);
  }
  log_err("runtime_eq/bltn_minus: non-number argument\n");
  exit(-1);
}

// multiply
sdata bltn__star(sdata x, sdata y) {
  if (x.tag == tnumb && y.tag == tnumb) {
    return SDNUMB(x.data.ivalue * y.data.ivalue);
  }
  log_err("runtime_eq/bltn_minus: non-number argument\n");
  exit(-1);
}

// divide
sdata bltn__slash(sdata x, sdata y) {
  if (x.tag == tnumb && y.tag == tnumb) {
    return SDNUMB(x.data.ivalue / y.data.ivalue);
  }
  log_err("runtime_eq/bltn_minus: non-number argument\n");
  exit(-1);
}

// modulo
sdata bltn_modulo(sdata x, sdata y) {
  if (x.tag == tnumb && y.tag == tnumb) {
    return SDNUMB(x.data.ivalue % y.data.ivalue);
  }
  log_err("runtime_eq/bltn_minus: non-number argument\n");
  exit(-1);
}


// =
sdata bltn__eql(sdata x, sdata y) {
  if (x.tag == tnumb && y.tag == tnumb) {
    return SDBOOL(x.data.ivalue == y.data.ivalue);
  }
  log_err("runtime_eq/bltn_minus: non-number argument\n");
  exit(-1);
}

// >
sdata bltn__to(sdata x, sdata y) {
  if (x.tag == tnumb && y.tag == tnumb) {
    return SDBOOL(x.data.ivalue > y.data.ivalue);
  }
  log_err("runtime_eq/bltn_minus: non-number argument\n");
  exit(-1);
}

// <
sdata bltn__lt(sdata x, sdata y) {
  if (x.tag == tnumb && y.tag == tnumb) {
    return SDBOOL(x.data.ivalue < y.data.ivalue);
  }
  log_err("runtime_eq/bltn_minus: non-number argument\n");
  exit(-1);
}

// >=
sdata bltn__to_eql(sdata x, sdata y) {
  if (x.tag == tnumb && y.tag == tnumb) {
    return SDBOOL(x.data.ivalue >= y.data.ivalue);
  }
  log_err("runtime_eq/bltn_minus: non-number argument\n");
  exit(-1);
}

// <=
sdata bltn__lt_eql(sdata x, sdata y) {
  if (x.tag == tnumb && y.tag == tnumb) {
    return SDBOOL(x.data.ivalue <= y.data.ivalue);
  }
  log_err("runtime_eq/bltn_minus: non-number argument\n");
  exit(-1);
}
